perm filename PGFAI.FAI[VIS,HPM] blob
sn#426072 filedate 1979-03-17 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00014 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 TITLE PGFAI
C00004 00003 T←0 ↔ YLO←1 ↔ XLO←2 ↔ YHI←3 ↔ XHI←4 ↔ PIC←7
C00007 00004 BITUP PMIDI PBSK XLMSK XRMSK
C00008 00005 HORUP
C00010 00006 VERUP: 0 ROUTINE FOR MAKING A VERTICAL
C00011 00007 DELT←6 ↔ DIND←12 ↔ XLO←14 ↔ YLO←15
C00015 00008 XL: 0.0
C00017 00009 XLITEN XDRKEN XINVEN
C00018 00010 PDOT: SAVAC(10)
C00019 00011 PLINE: SAVAC(16) DRAW A LINE FORM (X1,Y1) TO (X2,Y2)
C00020 00012 EXTERN $$$PX,$$$PY,$$$RNK,$$$DXS,$$$NS,$$LOUT,$$$LXS
C00022 00013 SAVN: 0
C00027 00014 END
C00028 ENDMK
C⊗;
TITLE PGFAI
;MAKES LINES AND THINGS IN ONE BIT PICTURES
ENTRY PDDINI,PSCREE,PSCREM,PLINE,PDOT,PPOLYG
ENTRY PDRKEN,PLITEN,PINVEN
ENTRY PBSK,PMIDI
ENTRY PPHYSS
PXLO: 0
PYLO: 0
PXHI: 0
PYHI: 0
PPIC: 0
PCLN←←0
PCWD←←1
PCBY←←2
PCBYA←←3
LNWD←←4
LNBY←←5
LNBYA←←6
WDBY←←7
WDBI←←10
BYBI←←11
BMAX←←12
BPTAB←13
LINTAB←←14
PIC←7
P←17
NWDS: 0 ;number of words in scanline, including border
XLOO:0 ;X offset
XLOL:0 ;left limit
XHIL:0 ;right limit
YLOO:0 ;Y offset
YLOL:0 ;top limit
YHIL:0 ;bottom limit
NLINA:0 ;virtual buffer height for SCREEN calculation
NBITA:0 ;virtual width
RETAD: 0
ACS: BLOCK 20
DEFINE SAVAC(N)
< IFGE N-12,{MOVEM 12,ACS+12}
IFGE N-16,{MOVEM 16,ACS+16}
IFGE N-17,{MOVEM 17,ACS+17} >
DEFINE RESAC(N)
< IFGE N-12,{MOVE 12,ACS+12}
IFGE N-16,{MOVE 16,ACS+16}
IFGE N-17,{MOVE 17,ACS+17} >
define fix(x)<kifix x,x>
T←0 ↔ YLO←1 ↔ XLO←2 ↔ YHI←3 ↔ XHI←4 ↔ PIC←7
PPHYSS: POP P,RETAD ;return position and limits of drawing buffer
POP P,XHI
MOVE T,PXHI
MOVEM T,(XHI)
POP P,YHI
MOVE T,PYHI
MOVEM T,(YHI)
POP P,XLO
MOVE T,PXLO
MOVEM T,(XLO)
POP P,YLO
MOVE T,PYLO
MOVEM T,(YLO)
POP P,PIC
MOVE T,PPIC
MOVEM T,(PIC)
JRST @RETAD
PDDINI: POP P,RETAD ;establish a buffer for drawing
POP P,XHI
POP P,YHI
POP P,XLO
POP P,YLO
POP P,PIC
MOVEM PIC,PPIC
CAMLE XLO,XHI
EXCH XLO,XHI
CAMLE YLO,YHI
EXCH YLO,YHI
MOVEM XLO,PXLO
MOVEM XHI,PXHI
MOVEM YLO,PYLO
MOVEM YHI,PYHI
MOVE T,YHI ;height, for SCREEN calculation
SUB T,YLO
ADDI T,1
MOVEM T,NLINA
MOVE T,XHI ;width, for SCREEN calculation
SUB T,XLO
ADDI T,1
MOVEM T,NBITA
MOVEM XLO,XLOO ;X offset for deposits
MOVEM YLO,YLOO ;Y offset
CAIGE XLO,0
MOVEI XLO,0
MOVEM XLO,XLOL ;physical left limit
CAIGE YLO,0
MOVEI YLO,0
MOVEM YLO,YLOL ;physical top limit
MOVE T,LNBY(PIC)
SUBI T,1
CAMLE XHI,T
MOVE XHI,T
MOVEM XHI,XHIL ;physical right limit
MOVE T,PCLN(PIC)
SUBI T,1
CAMLE YHI,T
MOVE YHI,T
MOVEM YHI,YHIL ;pyhsical bottom limit
MOVE YLO,LNWD(PIC)
MOVEM YLO,NWDS ;save scanlinesize
IMUL YLO,YLOO
MOVE T,LINTAB(PIC)
ADD T,YLO ;Y offset can be done implicitly
HRRM T,PMIDI
MOVN YLO,YLOO
ADDM YLO,YLOL
ADDM YLO,YHIL
JRST @RETAD
;BITUP PMIDI PBSK XLMSK XRMSK
X1←1 ↔ XA←2 ↔ X2←3 ↔ XB←4 ↔ Y1←5 ↔ Y2←11
XRMSK: FOR I←0,43,1 { (-1)⊗(-I)
}
XLMSK: FOR I←0,43,1 { ¬(377777777777⊗(-I))
}
PBSK: FOR I←0,43,1 { 400000000000 ⊗ (-I)
}
BITUP: 0 ;ROUTINE FOR PLACING A BIT AT (X1,Y1)
CAML Y1,YLOL
CAMLE Y1,YHIL
JRST @BITUP
ADD X1,XLOO
CAML X1,XLOL
CAMLE X1,XHIL
JRST @BITUP
IDIVI X1,44
MOVE 10,PBSK(XA)
IMUL Y1,NWDS
ADD X1,Y1
PMIDI: ORM 10,(X1)
JRST @BITUP
;HORUP
HORUP: 0 ;ROUTINE FOR PUTTING UP A HORIZONTAL
CAML Y1,YLOL ;LINE AT Y1, BETWEEN X1 AND X2
CAMLE Y1,YHIL
JRST @HORUP
ADD X1,XLOO
ADD X2,XLOO
CAMLE X1,X2
EXCH X1,X2
CAML X2,XLOL
CAMLE X1,XHIL
JRST @HORUP
CAMGE X1,XLOL
MOVE X1,XLOL
CAMLE X2,XHIL
MOVE X2,XHIL
IDIVI X1,44
IDIVI X2,44
MOVE 10,XRMSK(XA)
SUB X2,X1
MOVE 0,Y1
IMUL 0,NWDS
ADD X1,0
JUMPG X2,NOTE
AND 10,XLMSK(XB)
XCT PMIDI
JRST @HORUP
NOTE: XCT PMIDI
SETO 10,
LMDL: AOS X1
SOJLE X2,FINE
XCT PMIDI
AOJA X1,LMDL+1
FINE: MOVE 10,XLMSK(XB)
XCT PMIDI
JRST @HORUP
VERUP: 0 ;ROUTINE FOR MAKING A VERTICAL
ADD X1,XLOO
CAML X1,XLOL ;LINE AT X1 BETWEEN Y1 AND Y2
CAMLE X1,XHIL
JRST @VERUP
CAML Y1,Y2
EXCH Y1,Y2
CAML Y2,YLOL
CAMLE Y1,YHIL
JRST @VERUP
CAMGE Y1,YLOL
MOVE Y1,YLOL
CAMLE Y2,YHIL
MOVE Y2,YHIL
SUBI Y2,1
IDIVI X1,44
MOVE 10,PBSK(XA)
MOVE 0,Y1
IMUL 0,NWDS
ADD X1,0
VLP: XCT PMIDI
CAML Y1,Y2
JRST @VERUP
ADD X1,NWDS
AOJA Y1,VLP
DELT←6 ↔ DIND←12 ↔ XLO←14 ↔ YLO←15
OBLUP: 0 ;ROUTINE FOR DRAWING AN OBLIQUE
SUB X2,X1 ;LINE FROM (X1,Y1) TO (X2,Y2)
SUB Y2,Y1
MOVM XLO,X2
MOVM YLO,Y2
MOVEI DELT,400000
CAMLE XLO,YLO
JRST DXGR
DYGR: JUMPGE X2,DYPDXL
MOVN X2,X2
MOVN Y2,Y2
SUB X1,X2
SUB Y1,Y2
DYPDXL: HRL DELT,Y2
AOS DIND,X2
IDIV DELT,X2
HRLZ YLO,Y1
MOVE XLO,X1
SGLP: MOVE Y2,DELT
ADDB YLO,Y2
HLRE Y2,Y2
JSR VERUP
SOJLE DIND,@OBLUP
AOS X1,XLO
HLRE Y1,YLO
JRST SGLP
DXGR: JUMPGE Y2,DYPDXG
MOVN X2,X2
MOVN Y2,Y2
SUB X1,X2
SUB Y1,Y2
DYPDXG: HRL DELT,X2
AOS DIND,Y2
IDIV DELT,Y2
HRLZ XLO,X1
MOVE YLO,Y1
SIGLP1: MOVE X2,DELT
ADDB X2,XLO
HLRE X2,X2
JSR HORUP
SOJLE DIND,@OBLUP
AOS Y1,YLO
HLRE X1,XLO
JRST SIGLP1
XL: 0.0
XH: 1.0
XSC: 1476.0
YL: 0.0
YH: 1.0
YSC: 2048.0
PSCREE: SAVAC(3) ;SET UP SCREEN DIMENSIONS
POP P,RETAD ;SCREEN(XL,YL,XH,YH)
POP P,YL ;DEFAULT XL=0.0 YH=1.0
POP P,XH ; YL=0.0 YH=1.0
POP P,YH
POP P,XL
MOVE 1,XH
FSBR 1,XL
FLTR 3,NBITA
FMPR 3,[0.9999]
FDVR 3,1
MOVEM 3,XSC
MOVE 1,YH
FSBR 1,YL
FLTR 3,NLINA
FMPR 3,[0.9999]
FDVR 3,1
MOVEM 3,YSC
RESAC(3)
JRST @RETAD
PSCREM: POP P,RETAD
POP P,1
MOVE 2,YL
MOVEM 2,(1)
POP P,1
MOVE 2,XH
MOVEM 2,(1)
POP P,1
MOVE 2,YH
MOVEM 2,(1)
POP P,1
MOVE 2,XL
MOVEM 2,(1)
JRST @RETAD
;XLITEN XDRKEN XINVEN
PLITEN: MOVE 1,[ ORM 10,(X1)] ;OUTPUTS TO APPEAR BRIGHT
HLLM 1,PMIDI ;(ACTUALLY DARK TONER ON XGP)
POPJ P,
PDRKEN: MOVE 1,[ ANDCAM 10,(X1)] ;OUTPUTS DARK
HLLM 1,PMIDI ;(WHITE, ACTUALLY, PAPER SHOWS THRU)
POPJ P,
PINVEN: MOVE 1,[ XORM 10,(X1)] ;OUTPUTS TO NEGATE PREVIUS DISPLAY
HLLM 1,PMIDI
POPJ P,
PDOT: SAVAC(10)
POP P,RETAD
POP P,Y1
FSBR Y1,YL
FMPR Y1,YSC
FIX Y1
POP P,X1
FSBR X1,XL
FMPR X1,XSC
FIX X1
JSR BITUP
RESAC(10)
JRST @RETAD
PLINE: SAVAC(16) ;DRAW A LINE FORM (X1,Y1) TO (X2,Y2)
POP P,RETAD
POP P,Y2
FSBR Y2,YL
FMPR Y2,YSC
FIX Y2
POP P,X2 ;LINE(X1,Y1,X2,Y2)
FSBR X2,XL
FMPR X2,XSC
FIX X2
POP P,Y1
FSBR Y1,YL
FMPR Y1,YSC
FIX Y1
POP P,X1
FSBR X1,XL
FMPR X1,XSC
FIX X1
JSR OBLUP
RESAC(16)
JRST @RETAD
EXTERN $$$PX,$$$PY,$$$RNK,$$$DXS,$$$NS,$$LOUT,$$$LXS
X1←1 ↔ XA←2 ↔ JJ←2
X2←3 ↔ XB←4 ↔ T←4
Y1←5
Y2←←6
I←←7
II←←12
N←13
J←←14
TT←←15
TTT←←16
P←17
PPOLYG: movem 12,ac12# ;FILL IN AN N SIDED POLYGON
movem 16,ac16#
POP P,RETAD ; POLYGO(N,X,Y)
POP P,Y2 ; X AND Y ARE EACH CONTIGUOUS ARRAYS
POP P,X2
POP P,N
HRRZ T,N
MOVE N,T
LFL: MOVE TT,(X2)
FSBR TT,XL
FMPR TT,XSC
FIX TT
MOVEM TT,$$$PX(T)
MOVE TT,(Y2)
FSBR TT,YL
FMPR TT,YSC
FIX TT
MOVEM TT,$$$PY(T)
ADDI X2,1
ADDI Y2,1
SOJG T,LFL
JSR POLYUP
move 12,ac12
move 16,ac16
JRST @RETAD
SAVN: 0
POLYUP: 0 ;ROUTINE TO FILL IN A POLYGON
MOVEM N,SAVN
MOVEI I,1
MOVEM I,$$$RNK+1 ;PHASE 1, GENERATE AN
ILOP: AOS II,I ;INVERSE RANKING
MOVE T,$$$PY(I) ;KEYED ON Y VALUES
MOVEI J,1
JLOP: MOVE JJ,$$$RNK(J)
CAML T,$$$PY(JJ)
JRST NOXCH
EXCH II,$$$RNK(J)
MOVE T,$$$PY(II)
NOXCH: CAIGE J,-1(I)
AOJA J,JLOP
MOVEM II,$$$RNK(I)
CAMGE I,N
JRST ILOP
MOVE T,$$$PX+1
MOVEM T,$$$PX+1(N)
MOVE T,$$$PY+1
MOVEM T,$$$PY+1(N)
MOVE T,$$$PX(N)
MOVEM T,$$$PX
MOVE T,$$$PY(N)
MOVEM T,$$$PY
MOVEI I,1
MOVEI J,0
MOVE II,$$$RNK(I)
MOVE Y1,$$$PY(II)
NEWPNT: HRLZ X1,$$$PX(II)
MOVE T,$$$PY-1(II)
SUB T,Y1
JUMPLE T,TRYLOW+1 ;FORGET IT IF THIS EDGE POINTS
SKIPG JJ,J ;UPWARDS
JRST HINS
HILP: CAMG X1,$$$LXS(JJ)
JRST HINS
MOVE TT,$$$LXS(JJ)
MOVEM TT,$$$LXS+1(JJ)
MOVE TT,$$$DXS(JJ)
MOVEM TT,$$$DXS+1(JJ)
MOVE TT,$$$NS(JJ)
MOVEM TT,$$$NS+1(JJ)
SOJG JJ,HILP
HINS: MOVEM T,$$$NS+1(JJ) ;INSERT LINE SEGS
MOVEM X1,$$$LXS+1(JJ) ;COMING INTO THE SCANLINE
HLRE X1,X1
SUB X1,$$$PX-1(II)
HRLZ X2,X1
HRRI X1,400000
ADD X2,X1
IDIVI X2,1(T)
MOVNM X2,$$$DXS+1(JJ)
ADDI J,1
TRYLOW: HRLZ X1,$$$PX(II)
MOVE T,$$$PY+1(II)
SUB T,Y1
JUMPL T,DRAWG ;IF THIS EDGE POINTS
SKIPG JJ,J ;UPWARDS, TIME TO DRAW
JRST LINS
LILP: CAMG X1,$$$LXS(JJ)
JRST LINS
MOVE TT,$$$LXS(JJ)
MOVEM TT,$$$LXS+1(JJ)
MOVE TT,$$$DXS(JJ)
MOVEM TT,$$$DXS+1(JJ)
MOVE TT,$$$NS(JJ)
MOVEM TT,$$$NS+1(JJ)
SOJG JJ,LILP
LINS: MOVEM T,$$$NS+1(JJ)
MOVEM X1,$$$LXS+1(JJ)
HLRE X1,X1
SUB X1,$$$PX+1(II)
HRLZ X2,X1
HRRI X1,400000
ADD X2,X1
IDIVI X2,1(T)
MOVNM X2,$$$DXS+1(JJ)
ADDI J,1
DRAWG: CAML I,SAVN
JRST DRAWM
ADDI I,1
SCNRE: MOVE II,$$$RNK(I)
SCNR: CAMN Y1,$$$PY(II)
JRST NEWPNT
DRAWM: MOVE JJ,J ;UPDATE EACH EDGE
SETZB T,II ;AND THEN
FLOP: MOVE X1,$$$LXS(JJ) ;MAKE UP DRAWING LIST
MOVE X2,$$$DXS(JJ)
ADDB X2,$$$LXS(JJ)
JSR FILIN
SOSL $$$NS(JJ)
TRCE T,1
JUMPE T,BLAR
MOVE X2,$$$LXS-1(JJ)
JSR FILIN
BLAR: SOJG JJ,FLOP
DRAWZ: HRRE X1,$$LOUT(II) ;DRAW THIS SET
HLRE X2,$$LOUT(II)
JSR HORUP
SOJG II,DRAWZ
NEXL: MOVN JJ,J ;REMOVE EXPIRED SEGMNTS
HRLZ JJ,JJ ;AND MAKE POINTS SORTED
MOVEI J,0 ;AGAIN, IN PREPARATION
LPO: SKIPL $$$NS+1(JJ) ;FOR NEXT SCANLINE
AOJA J,NELP
SLOOP: AOBJN JJ,LPO
JUMPLE J,@POLYUP
AOJA Y1,SCNRE
NELP: MOVE T,$$$LXS+1(JJ)
MOVE TT,$$$DXS+1(JJ)
MOVE TTT,$$$NS+1(JJ)
MOVEI II,-1(J)
FLOOP: CAMG T,$$$LXS(II)
JRST PFND
MOVE X1,$$$LXS(II)
MOVEM X1,$$$LXS+1(II)
MOVE X1,$$$DXS(II)
MOVEM X1,$$$DXS+1(II)
MOVE X1,$$$NS(II)
MOVEM X1,$$$NS+1(II)
SOJG II,FLOOP
PFND: MOVEM T,$$$LXS+1(II)
MOVEM TT,$$$DXS+1(II)
MOVEM TTT,$$$NS+1(II)
AOBJN JJ,LPO
AOJA Y1,SCNRE
FILIN: 0 ;ADD A LINE SEGMENT
HLRM X1,$$LOUT+1(II)
HLLM X2,$$LOUT+1(II)
AOJA II,@FILIN
END